// interface 接口 定义对象的方式

// 接口的每一行只能有 `一个` 属性或方法，每一行不需要加分号。
interface User {
  name: string
  age: number
  sayHi(): void
}

const user: User = {
  name: 'cxk',
  age: 19,
  sayHi() {
    console.log('哈哈')
  },
}

interface Point2D {
  x: number
  y: number
}

//  要求   Point3D  继承  Point2D
// interface Point3D {
//   x: number
//   y: number
//   z: number
// }

// extends  关键字 继承  扩展的意思
interface Point3D extends Point2D {
  z: number
}

const xyz: Point3D = {
  x: 10,
  y: 20,
  z: 30,
}

type TypePoint2D = {
  x: number
  y: number
}

// 使用 `交叉类型` 实现接口的继承效果    &  表示

type TypePoint3D = TypePoint2D & {
  z: number
}

// type 和interface 的区别

// type Person = {
//   name: string

// }

// type Person = {
//   age:number
// }

interface Person {
  name: string
}

interface Person {
  age: number
}

interface Person {
  sex: string
}

const personObj: Person = {
  name: 'zs',
  age: 20,
  sex: '男',
}

// interface vs type 的区别

// 小结：

// - 它们都可以定义对象类型
// - 它们都可以复用，interface 使用 `extends` , type 使用 `&`
// - type 不能重复定义，interface 可以重复会合并
